package com.ys.作业;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 描述: ATM 为共享对象
 *
 * @author CodeYang
 * @version 2021/1/6 1:23
 */
public class ATM {

    /**
     * 创建人为的 公平锁
     */
    private Lock lck = new ReentrantLock(true);
    /**
     * 创建锁条件对象
     */
    private Condition condition = lck.newCondition();

    /**
     * 余额: 为0 取钱等待,(消费者等待) 不为0 && (不小于-1) 可以取钱,存钱等待(生产者等待)
     */
    private int money = 0;

    /**
     * 消费者模式:取钱
     * @return 返回money
     */
    public int getMoney() throws  Exception{
        lck.lock();
        try {
            // 如过没钱; 消费者等待生产者 生产 调用 wait进入 阻塞 等待状态
            while (this.money==0 ){
                condition.await();
            }
            //有钱就取钱
            int tempMoney = this.money;
            // 取钱取完了 设为0
            this.money = 0;
            //  取钱取完了,去唤醒 生产者去生产
            condition.signalAll();
            System.out.println(Thread.currentThread().getName()+":::成功取走"+tempMoney+"RMB");
            return tempMoney;
        }finally {
            lck.unlock();
        }

    }

    /**
     * 单列:生产者-消费者模式
     * 生产者模式; 存钱: 如果余额不为空,我就不存钱,
     *     存钱时,不能取钱,
     * @param money
     */
    public void setMoney(int money) throws  Exception{
        lck.lock();
        try {
            // 判断是否有余额;有余额就不存钱
            while (this.money!=0){
                condition.await();
            }
            //没有余额就存钱
            this.money = money;
            //存钱之后,通知消费者取钱
            condition.signalAll();
            System.out.println(Thread.currentThread().getName()+":::成功存入:"+this.money+"RMB");
        }finally {
            lck.unlock();
        }

    }
}
